﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using mrp16062010.Simulation.Siralama;
using Newtonsoft.Json;

namespace mrp16062010.Simulation
{
    [JsonObject(IsReference = true)]
    class Kuyruk
    {
        private List<IsParcasi> liste=new List<IsParcasi>();

        public List<IsParcasi> Liste
        {
            get { return liste; }
            set { liste = value; }
        }

        private int kalanParcaAdedi;

        public int KalanParcaAdedi
        {
            get
            {
                kalanParcaAdedi = 0;
                foreach (IsParcasi parca in liste)
                {
                    kalanParcaAdedi += parca.ParcaAdedi;
                }
                return kalanParcaAdedi;
            }
        }

        public IslemTipi KuyrukTipi
        {
            get { return this.AitMakine.BulunduguOrtam.KuyrukSiralamaTipi; }
        }

        public Makine AitMakine { get; set; }

        public GirisCikis GirisMiCikisMi { get; set; }

        public enum GirisCikis
        {
            Giris, Cikis
        }

        public enum IslemTipi
        {
            Fifo=0, Lifo=1, EarlyDoDate=2, ShortestProcessTime=3, LongestProcessTime=4, CriticalRatio=5, ShortestOperationNumber=6, LongestOperationNumber=7, ShortestLeftOperationTime=8, LongestLeftOperationTime=9
        }

        public delegate void EklendiHandler(IsParcasi o, EventArgs e);

        public event EklendiHandler Eklendi;

        protected virtual void OnEklendi(IsParcasi o, EventArgs e)
        {
            if (Eklendi!=null)
            {
                Eklendi(o, e);
            }
        }

        public delegate void EkleniyorHandler(IsParcasi o, EventArgs e);

        public event EkleniyorHandler Ekleniyor;

        protected virtual void OnEkleniyor(IsParcasi o, EventArgs e)
        {
            if (Ekleniyor != null)
            {
                Ekleniyor(o, e);
            }
        }

        public void Ekle(IsParcasi parca)
        {
            if (this.liste.Contains(parca) == false)
            {
               
                this.OnEkleniyor(parca, new EventArgs());
                this.liste.Add(parca);
                if (this.GirisMiCikisMi==GirisCikis.Giris)
                {
                    
                    //kritik oranını hesaplıyoruz
                    parca.KritikOran = KritikOran(parca);

                    //Siparişin ilk parçası mı, ilk parçaysa sipariş bilgisini güncelle
                    if (parca.ArkasindakiIsParcalari.Count == 0)
                    {
                        if (parca.SiparisBilgi.SimilasyonTarihleri.BaslangicTarihi==DateTime.MinValue|| parca.SiparisBilgi.SimilasyonTarihleri.BaslangicTarihi > parca.SimulasyonBilgisi.GirisBeklemeTarihi.BaslangicTarihi)
                        {
                            parca.SiparisBilgi.SimilasyonTarihleri.BaslangicTarihi = parca.SimulasyonBilgisi.GirisBeklemeTarihi.BaslangicTarihi;
                        }
                    }
                }
                Sirala();
                this.OnEklendi(parca, new EventArgs());
            }
        }

        public double KritikOran(IsParcasi gelen)
        {
            TimeSpan toplamSure = new TimeSpan();
            foreach (IsParcasi item in liste)
            {
                toplamSure += item.Uzunluk;
            }

            double oran =
               ((TimeSpan)(gelen.RotaninSonParcasi.BitTarihi - this.AitMakine.BulunduguOrtam.SonTarih)).TotalMinutes / toplamSure.TotalMinutes;

            return oran;

        }

        public IsParcasi Cek()
        {
            IsParcasi siradaki;
            if (liste.Count > 0)
            {
                Sirala();
                siradaki = liste.Where(x => x.HazirMi == true).FirstOrDefault();
                liste.Remove(siradaki);
            }
            else
            {
                siradaki = null;
            }
            return siradaki;
        }

        private void Sirala()
        {
            liste = liste.Sirala(this.KuyrukTipi);
        }



        public TimeSpan KalanUzunluk
        {
            get
            {
                TimeSpan kalan = new TimeSpan();
                foreach (IsParcasi item in liste)
                {
                    kalan += item.Uzunluk;
                }
                return kalan;
            }
        }
        
    }
}
